import fs from 'fs'
import YAML from 'yaml'
import chokidar from 'chokidar'

/**
 * 配置文件管理类
 */
class Config {
  constructor() {
    this.configPath = 'plugins/mys-sign-plugin/config'
    this.config = {}
    this.watcher = null
    
    this.init()
  }

  /**
   * 初始化配置
   */
  init() {
    this.loadConfig()
    this.watch()
  }

  /**
   * 加载配置文件
   */
  loadConfig() {
    try {
      // 读取默认配置
      const defaultConfig = this.readYaml('config_default.yaml')
      
      // 读取用户配置（如果存在）
      let userConfig = {}
      if (fs.existsSync(`${this.configPath}/config.yaml`)) {
        userConfig = this.readYaml('config.yaml')
      }
      
      // 合并配置
      this.config = this.mergeConfig(defaultConfig, userConfig)
      
      logger.info('[签到插件] 配置加载完成')
    } catch (error) {
      logger.error('[签到插件] 配置加载失败：', error)
    }
  }

  /**
   * 读取YAML文件
   */
  readYaml(filename) {
    try {
      const file = `${this.configPath}/${filename}`
      if (!fs.existsSync(file)) {
        return {}
      }
      const data = fs.readFileSync(file, 'utf8')
      return YAML.parse(data) || {}
    } catch (error) {
      logger.error(`[签到插件] 读取配置文件 ${filename} 失败：`, error)
      return {}
    }
  }

  /**
   * 合并配置
   */
  mergeConfig(defaultConfig, userConfig) {
    return Object.assign({}, defaultConfig, userConfig)
  }

  /**
   * 监听配置文件变化
   */
  watch() {
    if (this.watcher) return
    
    try {
      this.watcher = chokidar.watch(`${this.configPath}/*.yaml`, {
        persistent: true
      })

      this.watcher.on('change', (path) => {
        logger.info(`[签到插件] 配置文件 ${path} 已更新，重新加载配置`)
        this.loadConfig()
      })
    } catch (error) {
      logger.error('[签到插件] 配置文件监听失败：', error)
    }
  }

  /**
   * 获取配置项
   */
  get(key, defaultValue = null) {
    const keys = key.split('.')
    let value = this.config

    for (const k of keys) {
      if (value && typeof value === 'object' && k in value) {
        value = value[k]
      } else {
        return defaultValue
      }
    }

    return value
  }

  /**
   * 获取所有配置
   */
  getAll() {
    return this.config
  }
}

// 导出单例
export default new Config()

